for creating interdomain event channels bound to IRQ handlers.
Signed-off-by: Keir Fraser <keir@xensource.com>
tpmif_tx_interface_t *tx;
atomic_t refcnt;
- unsigned int evtchn;
unsigned int irq;
u8 is_connected;
u8 is_suspended;
if (tp->irq)
unbind_from_irqhandler(tp->irq, tp);
- tp->evtchn = tp->irq = 0;
+ tp->irq = 0;
}
goto abort_transaction;
}
- err = xenbus_printf(xbt, dev->nodename,
- "event-channel", "%u", tp->evtchn);
+ err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
+ irq_to_evtchn_port(tp->irq));
if (err) {
message = "writing event-channel";
goto abort_transaction;
tp->backend_id = domid;
- err = xenbus_alloc_evtchn(dev, &tp->evtchn);
- if (err)
- return err;
-
- err = bind_evtchn_to_irqhandler(tp->evtchn,
- tpmif_int, SA_SAMPLE_RANDOM, "tpmif",
- tp);
+ err = bind_listening_port_to_irqhandler(
+ domid, tpmif_int, SA_SAMPLE_RANDOM, "tpmif", tp);
if (err <= 0) {
- WPRINTK("bind_evtchn_to_irqhandler failed (err=%d)\n", err);
+ WPRINTK("bind_listening_port_to_irqhandler failed "
+ "(err=%d)\n", err);
return err;
}
-
tp->irq = err;
+
return 0;
}
mb();
- DPRINTK("Notifying backend via event channel %d\n",
- tp->evtchn);
-
notify_remote_via_irq(tp->irq);
spin_unlock_irq(&tp->tx_lock);
domid_t domid;
unsigned int handle;
/* Physical parameters of the comms window. */
- unsigned int evtchn;
unsigned int irq;
/* Comms information. */
blkif_back_ring_t blk_ring;
{
blkif_sring_t *sring;
int err;
- struct evtchn_bind_interdomain bind_interdomain;
/* Already connected through? */
if (blkif->irq)
return err;
}
- bind_interdomain.remote_dom = blkif->domid;
- bind_interdomain.remote_port = evtchn;
+ sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
+ BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
- err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
- &bind_interdomain);
- if (err) {
+ err = bind_interdomain_evtchn_to_irqhandler(
+ blkif->domid, evtchn, blkif_be_int, 0, "blkif-backend", blkif);
+ if (err < 0)
+ {
unmap_frontend_page(blkif);
free_vm_area(blkif->blk_ring_area);
return err;
}
-
- blkif->evtchn = bind_interdomain.local_port;
-
- sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
- BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
-
- blkif->irq = bind_evtchn_to_irqhandler(
- blkif->evtchn, blkif_be_int, 0, "blkif-backend", blkif);
+ blkif->irq = err;
return 0;
}
message = "writing ring-ref";
goto abort_transaction;
}
- err = xenbus_printf(xbt, dev->nodename,
- "event-channel", "%u", info->evtchn);
+ err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
+ irq_to_evtchn_port(info->irq));
if (err) {
message = "writing event-channel";
goto abort_transaction;
}
info->ring_ref = err;
- err = xenbus_alloc_evtchn(dev, &info->evtchn);
- if (err)
- goto fail;
-
- err = bind_evtchn_to_irqhandler(
- info->evtchn, blkif_int, SA_SAMPLE_RANDOM, "blkif", info);
+ err = bind_listening_port_to_irqhandler(
+ dev->otherend_id, blkif_int, SA_SAMPLE_RANDOM, "blkif", info);
if (err <= 0) {
xenbus_dev_fatal(dev, err,
- "bind_evtchn_to_irqhandler failed");
+ "bind_listening_port_to_irqhandler");
goto fail;
}
info->irq = err;
}
if (info->irq)
unbind_from_irqhandler(info->irq, info);
- info->evtchn = info->irq = 0;
-
+ info->irq = 0;
}
static void blkif_completion(struct blk_shadow *s)
int connected;
int ring_ref;
blkif_front_ring_t ring;
- unsigned int evtchn, irq;
+ unsigned int irq;
struct xlbd_major_info *mi;
request_queue_t *rq;
struct work_struct work;
domid_t domid;
unsigned int handle;
/* Physical parameters of the comms window. */
- unsigned int evtchn;
unsigned int irq;
/* Comms information. */
blkif_back_ring_t blk_ring;
{
blkif_sring_t *sring;
int err;
- struct evtchn_bind_interdomain bind_interdomain;
/* Already connected through? */
if (blkif->irq)
return err;
}
- bind_interdomain.remote_dom = blkif->domid;
- bind_interdomain.remote_port = evtchn;
+ sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
+ BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
- err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
- &bind_interdomain);
- if (err) {
+ err = bind_interdomain_evtchn_to_irqhandler(
+ blkif->domid, evtchn, tap_blkif_be_int,
+ 0, "blkif-backend", blkif);
+ if (err < 0) {
unmap_frontend_page(blkif);
free_vm_area(blkif->blk_ring_area);
return err;
}
-
- blkif->evtchn = bind_interdomain.local_port;
-
- sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
- BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
-
- blkif->irq = bind_evtchn_to_irqhandler(
- blkif->evtchn, tap_blkif_be_int, 0, "blkif-backend", blkif);
+ blkif->irq = err;
return 0;
}
!xen_start_info->console.domU.evtchn)
return -ENODEV;
- irq = bind_evtchn_to_irqhandler(
+ irq = bind_caller_port_to_irqhandler(
xen_start_info->console.domU.evtchn,
handle_input, 0, "xencons", NULL);
if (irq < 0) {
static u32 irq_info[NR_IRQS];
/* Binding types. */
-enum { IRQT_UNBOUND, IRQT_PIRQ, IRQT_VIRQ, IRQT_IPI, IRQT_EVTCHN };
+enum {
+ IRQT_UNBOUND,
+ IRQT_PIRQ,
+ IRQT_VIRQ,
+ IRQT_IPI,
+ IRQT_LOCAL_PORT,
+ IRQT_CALLER_PORT
+};
/* Constructor for packed IRQ information. */
static inline u32 mk_irq_info(u32 type, u32 index, u32 evtchn)
return -ENOSPC;
}
-static int bind_evtchn_to_irq(unsigned int evtchn)
+static int bind_caller_port_to_irq(unsigned int caller_port)
{
int irq;
spin_lock(&irq_mapping_update_lock);
- if ((irq = evtchn_to_irq[evtchn]) == -1) {
+ if ((irq = evtchn_to_irq[caller_port]) == -1) {
if ((irq = find_unbound_irq()) < 0)
goto out;
- evtchn_to_irq[evtchn] = irq;
- irq_info[irq] = mk_irq_info(IRQT_EVTCHN, 0, evtchn);
+ evtchn_to_irq[caller_port] = irq;
+ irq_info[irq] = mk_irq_info(IRQT_CALLER_PORT, 0, caller_port);
}
irq_bindcount[irq]++;
return irq;
}
+static int bind_local_port_to_irq(unsigned int local_port)
+{
+ int irq;
+
+ spin_lock(&irq_mapping_update_lock);
+
+ BUG_ON(evtchn_to_irq[local_port] != -1);
+
+ if ((irq = find_unbound_irq()) < 0) {
+ struct evtchn_close close = { .port = local_port };
+ if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
+ BUG();
+ goto out;
+ }
+
+ evtchn_to_irq[local_port] = irq;
+ irq_info[irq] = mk_irq_info(IRQT_LOCAL_PORT, 0, local_port);
+ irq_bindcount[irq]++;
+
+ out:
+ spin_unlock(&irq_mapping_update_lock);
+ return irq;
+}
+
+static int bind_listening_port_to_irq(unsigned int remote_domain)
+{
+ struct evtchn_alloc_unbound alloc_unbound;
+ int err;
+
+ alloc_unbound.dom = DOMID_SELF;
+ alloc_unbound.remote_dom = remote_domain;
+
+ err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
+ &alloc_unbound);
+
+ return err ? : bind_local_port_to_irq(alloc_unbound.port);
+}
+
+static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
+ unsigned int remote_port)
+{
+ struct evtchn_bind_interdomain bind_interdomain;
+ int err;
+
+ bind_interdomain.remote_dom = remote_domain;
+ bind_interdomain.remote_port = remote_port;
+
+ err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
+ &bind_interdomain);
+
+ return err ? : bind_local_port_to_irq(bind_interdomain.local_port);
+}
+
static int bind_virq_to_irq(unsigned int virq, unsigned int cpu)
{
struct evtchn_bind_virq bind_virq;
if ((--irq_bindcount[irq] == 0) && VALID_EVTCHN(evtchn)) {
close.port = evtchn;
- if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
+ if ((type_from_irq(irq) != IRQT_CALLER_PORT) &&
+ HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
BUG();
switch (type_from_irq(irq)) {
spin_unlock(&irq_mapping_update_lock);
}
-int bind_evtchn_to_irqhandler(
- unsigned int evtchn,
+int bind_caller_port_to_irqhandler(
+ unsigned int caller_port,
+ irqreturn_t (*handler)(int, void *, struct pt_regs *),
+ unsigned long irqflags,
+ const char *devname,
+ void *dev_id)
+{
+ int irq, retval;
+
+ irq = bind_caller_port_to_irq(caller_port);
+ if (irq < 0)
+ return irq;
+
+ retval = request_irq(irq, handler, irqflags, devname, dev_id);
+ if (retval != 0) {
+ unbind_from_irq(irq);
+ return retval;
+ }
+
+ return irq;
+}
+EXPORT_SYMBOL_GPL(bind_caller_port_to_irqhandler);
+
+int bind_listening_port_to_irqhandler(
+ unsigned int remote_domain,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags,
const char *devname,
void *dev_id)
{
- unsigned int irq;
- int retval;
+ int irq, retval;
- irq = bind_evtchn_to_irq(evtchn);
+ irq = bind_listening_port_to_irq(remote_domain);
if (irq < 0)
return irq;
return irq;
}
-EXPORT_SYMBOL_GPL(bind_evtchn_to_irqhandler);
+EXPORT_SYMBOL_GPL(bind_listening_port_to_irqhandler);
+
+int bind_interdomain_evtchn_to_irqhandler(
+ unsigned int remote_domain,
+ unsigned int remote_port,
+ irqreturn_t (*handler)(int, void *, struct pt_regs *),
+ unsigned long irqflags,
+ const char *devname,
+ void *dev_id)
+{
+ int irq, retval;
+
+ irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port);
+ if (irq < 0)
+ return irq;
+
+ retval = request_irq(irq, handler, irqflags, devname, dev_id);
+ if (retval != 0) {
+ unbind_from_irq(irq);
+ return retval;
+ }
+
+ return irq;
+}
+EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irqhandler);
int bind_virq_to_irqhandler(
unsigned int virq,
const char *devname,
void *dev_id)
{
- unsigned int irq;
- int retval;
+ int irq, retval;
irq = bind_virq_to_irq(virq, cpu);
if (irq < 0)
const char *devname,
void *dev_id)
{
- unsigned int irq;
- int retval;
+ int irq, retval;
irq = bind_ipi_to_irq(ipi, cpu);
if (irq < 0)
}
EXPORT_SYMBOL_GPL(notify_remote_via_irq);
+int irq_to_evtchn_port(int irq)
+{
+ return evtchn_from_irq(irq);
+}
+EXPORT_SYMBOL_GPL(irq_to_evtchn_port);
+
void mask_evtchn(int port)
{
shared_info_t *s = HYPERVISOR_shared_info;
struct page **pages;
struct list_head mappings; /* protected by mm_lock */
- unsigned evtchn;
int irq;
struct xenfb_page *page;
unsigned long *mfns;
wmb(); /* ensure ring contents visible */
info->page->out_prod = prod + 1;
- notify_remote_via_evtchn(info->evtchn);
+ notify_remote_via_irq(info->irq);
}
static int xenfb_queue_full(struct xenfb_info *info)
if (page->in_cons != page->in_prod) {
info->page->in_cons = info->page->in_prod;
- notify_remote_via_evtchn(info->evtchn);
+ notify_remote_via_irq(info->irq);
}
return IRQ_HANDLED;
}
int ret;
struct xenbus_transaction xbt;
- ret = xenbus_alloc_evtchn(dev, &info->evtchn);
- if (ret)
- return ret;
- ret = bind_evtchn_to_irqhandler(info->evtchn, xenfb_event_handler,
- 0, "xenfb", info);
+ ret = bind_listening_port_to_irqhandler(
+ dev->otherend_id, xenfb_event_handler, 0, "xenfb", info);
if (ret < 0) {
- xenbus_free_evtchn(dev, info->evtchn);
- xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler");
+ xenbus_dev_fatal(dev, ret,
+ "bind_listening_port_to_irqhandler");
return ret;
}
info->irq = ret;
if (ret)
goto error_xenbus;
ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
- info->evtchn);
+ irq_to_evtchn_port(info->irq));
if (ret)
goto error_xenbus;
ret = xenbus_printf(xbt, dev->nodename, "feature-update", "1");
{
struct input_dev *dev;
struct xenkbd_page *page;
- unsigned evtchn;
int irq;
struct xenbus_device *xbdev;
};
input_sync(info->dev);
mb(); /* ensure we got ring contents */
page->in_cons = cons;
- notify_remote_via_evtchn(info->evtchn);
+ notify_remote_via_irq(info->irq);
return IRQ_HANDLED;
}
int ret;
struct xenbus_transaction xbt;
- ret = xenbus_alloc_evtchn(dev, &info->evtchn);
- if (ret)
- return ret;
- ret = bind_evtchn_to_irqhandler(info->evtchn, input_handler, 0,
- "xenkbd", info);
+ ret = bind_listening_port_to_irqhandler(
+ dev->otherend_id, input_handler, 0, "xenkbd", info);
if (ret < 0) {
- xenbus_free_evtchn(dev, info->evtchn);
- xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler");
+ xenbus_dev_fatal(dev, ret,
+ "bind_listening_port_to_irqhandler");
return ret;
}
info->irq = ret;
if (ret)
goto error_xenbus;
ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
- info->evtchn);
+ irq_to_evtchn_port(info->irq));
if (ret)
goto error_xenbus;
ret = xenbus_transaction_end(xbt, 0);
grant_ref_t tx_shmem_ref;
grant_handle_t rx_shmem_handle;
grant_ref_t rx_shmem_ref;
- unsigned int evtchn;
unsigned int irq;
/* The shared rings and indexes. */
int err = -ENOMEM;
netif_tx_sring_t *txs;
netif_rx_sring_t *rxs;
- struct evtchn_bind_interdomain bind_interdomain;
/* Already connected through? */
if (netif->irq)
if (err)
goto err_map;
- bind_interdomain.remote_dom = netif->domid;
- bind_interdomain.remote_port = evtchn;
-
- err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
- &bind_interdomain);
- if (err)
+ err = bind_interdomain_evtchn_to_irqhandler(
+ netif->domid, evtchn, netif_be_int, 0,
+ netif->dev->name, netif);
+ if (err < 0)
goto err_hypervisor;
-
- netif->evtchn = bind_interdomain.local_port;
-
- netif->irq = bind_evtchn_to_irqhandler(
- netif->evtchn, netif_be_int, 0, netif->dev->name, netif);
+ netif->irq = err;
disable_irq(netif->irq);
txs = (netif_tx_sring_t *)netif->tx_comms_area->addr;
spinlock_t tx_lock;
spinlock_t rx_lock;
- unsigned int evtchn, irq;
+ unsigned int irq;
unsigned int copying_receiver;
/* Receive-ring batched refills. */
goto abort_transaction;
}
err = xenbus_printf(xbt, dev->nodename,
- "event-channel", "%u", info->evtchn);
+ "event-channel", "%u",
+ irq_to_evtchn_port(info->irq));
if (err) {
message = "writing event-channel";
goto abort_transaction;
}
info->rx_ring_ref = err;
- err = xenbus_alloc_evtchn(dev, &info->evtchn);
- if (err)
- goto fail;
-
memcpy(netdev->dev_addr, info->mac, ETH_ALEN);
- err = bind_evtchn_to_irqhandler(info->evtchn, netif_int,
- SA_SAMPLE_RANDOM, netdev->name,
- netdev);
+
+ err = bind_listening_port_to_irqhandler(
+ dev->otherend_id, netif_int, SA_SAMPLE_RANDOM, netdev->name,
+ netdev);
if (err < 0)
goto fail;
info->irq = err;
+
return 0;
fail:
if (info->irq)
unbind_from_irqhandler(info->irq, info->netdev);
- info->evtchn = info->irq = 0;
+ info->irq = 0;
end_access(info->tx_ring_ref, info->tx.sring);
end_access(info->rx_ring_ref, info->rx.sring);
int remote_evtchn)
{
int err = 0;
- int evtchn;
struct vm_struct *area;
dev_dbg(&pdev->xdev->dev,
pdev->sh_area = area;
pdev->sh_info = area->addr;
- err = xenbus_bind_evtchn(pdev->xdev, remote_evtchn, &evtchn);
- if (err)
- goto out;
-
- err = bind_evtchn_to_irqhandler(evtchn, pciback_handle_event,
- SA_SAMPLE_RANDOM, "pciback", pdev);
+ err = bind_interdomain_evtchn_to_irqhandler(
+ pdev->xdev->otherend_id, remote_evtchn, pciback_handle_event,
+ SA_SAMPLE_RANDOM, "pciback", pdev);
if (err < 0) {
xenbus_dev_fatal(pdev->xdev, err,
"Error binding event channel to IRQ");
unsigned int handle;
/* Physical parameters of the comms window. */
- unsigned int evtchn;
unsigned int irq;
/* The shared rings and indexes. */
int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn)
{
int err;
- struct evtchn_bind_interdomain bind_interdomain;
- if (tpmif->irq) {
+ if (tpmif->irq)
return 0;
- }
if ((tpmif->tx_area = alloc_vm_area(PAGE_SIZE)) == NULL)
return -ENOMEM;
return err;
}
+ tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr;
- bind_interdomain.remote_dom = tpmif->domid;
- bind_interdomain.remote_port = evtchn;
-
- err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
- &bind_interdomain);
- if (err) {
+ err = bind_interdomain_evtchn_to_irqhandler(
+ tpmif->domid, evtchn, tpmif_be_int, 0, tpmif->devname, tpmif);
+ if (err < 0) {
unmap_frontend_page(tpmif);
free_vm_area(tpmif->tx_area);
return err;
}
+ tpmif->irq = err;
- tpmif->evtchn = bind_interdomain.local_port;
-
- tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr;
-
- tpmif->irq = bind_evtchn_to_irqhandler(
- tpmif->evtchn, tpmif_be_int, 0, tpmif->devname, tpmif);
tpmif->shmem_ref = shared_page;
tpmif->active = 1;
EXPORT_SYMBOL_GPL(xenbus_alloc_evtchn);
-int xenbus_bind_evtchn(struct xenbus_device *dev, int remote_port, int *port)
-{
- struct evtchn_bind_interdomain bind_interdomain;
- int err;
-
- bind_interdomain.remote_dom = dev->otherend_id;
- bind_interdomain.remote_port = remote_port,
-
- err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
- &bind_interdomain);
- if (err)
- xenbus_dev_fatal(dev, err,
- "binding to event channel %d from domain %d",
- remote_port, dev->otherend_id);
- else
- *port = bind_interdomain.local_port;
-
- return err;
-}
-EXPORT_SYMBOL_GPL(xenbus_bind_evtchn);
-
-
int xenbus_free_evtchn(struct xenbus_device *dev, int port)
{
struct evtchn_close close;
if (xenbus_irq)
unbind_from_irqhandler(xenbus_irq, &xb_waitq);
- err = bind_evtchn_to_irqhandler(
+ err = bind_caller_port_to_irqhandler(
xen_store_evtchn, wake_waiting,
0, "xenbus", &xb_waitq);
if (err <= 0) {
* The IRQ argument passed to the callback handler is the same as returned
* from the bind call. It may not correspond to a Linux IRQ number.
* Returns IRQ or negative errno.
- * UNBIND: Takes IRQ to unbind from; automatically closes the event channel.
*/
-extern int bind_evtchn_to_irqhandler(
- unsigned int evtchn,
+int bind_caller_port_to_irqhandler(
+ unsigned int caller_port,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags,
const char *devname,
void *dev_id);
-extern int bind_virq_to_irqhandler(
+int bind_listening_port_to_irqhandler(
+ unsigned int remote_domain,
+ irqreturn_t (*handler)(int, void *, struct pt_regs *),
+ unsigned long irqflags,
+ const char *devname,
+ void *dev_id);
+int bind_interdomain_evtchn_to_irqhandler(
+ unsigned int remote_domain,
+ unsigned int remote_port,
+ irqreturn_t (*handler)(int, void *, struct pt_regs *),
+ unsigned long irqflags,
+ const char *devname,
+ void *dev_id);
+int bind_virq_to_irqhandler(
unsigned int virq,
unsigned int cpu,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags,
const char *devname,
void *dev_id);
-extern int bind_ipi_to_irqhandler(
+int bind_ipi_to_irqhandler(
unsigned int ipi,
unsigned int cpu,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
/*
* Common unbind function for all event sources. Takes IRQ to unbind from.
- * Automatically closes the underlying event channel (even for bindings
- * made with bind_evtchn_to_irqhandler()).
+ * Automatically closes the underlying event channel (except for bindings
+ * made with bind_caller_port_to_irqhandler()).
*/
-extern void unbind_from_irqhandler(unsigned int irq, void *dev_id);
+void unbind_from_irqhandler(unsigned int irq, void *dev_id);
-extern void irq_resume(void);
+void irq_resume(void);
/* Entry point for notifications into Linux subsystems. */
asmlinkage void evtchn_do_upcall(struct pt_regs *regs);
/* Entry point for notifications into the userland character device. */
-extern void evtchn_device_upcall(int port);
+void evtchn_device_upcall(int port);
-extern void mask_evtchn(int port);
-extern void unmask_evtchn(int port);
+void mask_evtchn(int port);
+void unmask_evtchn(int port);
static inline void clear_evtchn(int port)
{
}
/*
- * Unlike notify_remote_via_evtchn(), this is safe to use across
- * save/restore. Notifications on a broken connection are silently dropped.
+ * Use these to access the event channel underlying the IRQ handle returned
+ * by bind_*_to_irqhandler().
*/
-extern void notify_remote_via_irq(int irq);
+void notify_remote_via_irq(int irq);
+int irq_to_evtchn_port(int irq);
#endif /* __ASM_EVTCHN_H__ */
int xenbus_alloc_evtchn(struct xenbus_device *dev, int *port);
-/**
- * Bind to an existing interdomain event channel in another domain. Returns 0
- * on success and stores the local port in *port. On error, returns -errno,
- * switches the device to XenbusStateClosing, and saves the error in XenStore.
- */
-int xenbus_bind_evtchn(struct xenbus_device *dev, int remote_port, int *port);
-
-
/**
* Free an existing event channel. Returns 0 on success or -errno on error.
*/